﻿using sipfe.model.dataAccess;
using sipfe.util;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace sipfe.model.persona
{
   public class EmpresaDAO
    {
       private BDSIPFEEntities db = new BDSIPFEEntities();
 
        public List<SIPMaeEmpresa> ListaEmpresasManteDAO(string v_NombresPersona)
        {
            var resultado = db.SIPMaeEmpresa.Where(s => (s.vRazonSocial).Contains(v_NombresPersona)).OrderBy(s => s.vRazonSocial).ToList();
            return resultado;
        }

        public List<SIPMaeEmpresa> ListaEmpresasManteByIdDAO(int n_IdeEmpresa)
        {
            return db.SIPMaeEmpresa.Where(s => s.nIdeEmpresa == n_IdeEmpresa).ToList(); 
        }

        public string[] UpdateDatosEmpresaInpDAO(SIPMaeEmpresa sipMaeEmpresa)
        {
             db.Entry(sipMaeEmpresa).State = EntityState.Modified;
            db.SaveChanges();
            return new String[] { sipMaeEmpresa.nIdeEmpresa.ToString() };
        }

        public SIPMaeEmpresa AgregaTelefonoManteDAO(int n_IdePersona, int n_IdeUsuario, string v_Prefijo, string v_NumTelefono)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            int cantTelefono = db.SIPDetTelefono.Where(s => s.vPrefijo == v_Prefijo && s.vNumTel == v_NumTelefono && (s.dFecFinVig == null ? DateTime.Today : s.dFecFinVig) >= DateTime.Today && s.dFecIniVig <= DateTime.Today).Count();
            if (cantTelefono <= 0)
            {
                SIPDetTelefono sipDetTelefono = new SIPDetTelefono();
                sipDetTelefono.nIdeEmpresa = n_IdePersona;
                sipDetTelefono.vPrefijo = v_Prefijo;
                sipDetTelefono.vNumTel = v_NumTelefono;
                sipDetTelefono.nIdeUsuReg = n_IdeUsuario;
                sipDetTelefono.dtFecReg = DateTime.Now;
                sipDetTelefono.dFecIniVig = hoy;
                db.SIPDetTelefono.Add(sipDetTelefono);
                db.SaveChanges();
            }
            db = new BDSIPFEEntities();
            return db.SIPMaeEmpresa.Where(x => x.nIdeEmpresa == n_IdePersona).FirstOrDefault();
        }

        public SIPMaeEmpresa AgregaCorreoElectronicoManteDAO(int n_IdePersona, int n_IdeUsuario, string v_Correo)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            int cantEmail = db.SIPDetCorreo.Where(s => s.vCorreo == v_Correo && s.nIdeEmpresa == n_IdePersona&& (s.dFecFinVig == null ? DateTime.Today : s.dFecFinVig) >= DateTime.Today && s.dFecIniVig <= DateTime.Today).Count();
            if (cantEmail<=0)
            {
                SIPDetCorreo sipDetCorreo = new SIPDetCorreo();
                sipDetCorreo.nIdeEmpresa = n_IdePersona;
                sipDetCorreo.vCorreo = v_Correo;
                sipDetCorreo.nIdeUsuReg = n_IdeUsuario;
                sipDetCorreo.dFecReg = DateTime.Now;
                sipDetCorreo.dFecIniVig = hoy;
                db.SIPDetCorreo.Add(sipDetCorreo);
                db.SaveChanges();
            }            
            db = new BDSIPFEEntities();
            return db.SIPMaeEmpresa.Where(x => x.nIdeEmpresa == n_IdePersona).FirstOrDefault();
        }


        public SIPMaeEmpresa AgregarDireccionEmpresaManteDAO(SIPDetDireccion direccion)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            DateTime ayer = UtilitariosUtil.FechaAyer();
            direccion.dFecIniVig = hoy;
            direccion.dtFecReg = DateTime.Now;
            db.SIPDetDireccion.Add(direccion);

            //chuzpcerramos la fecha de vigencia de las direcciones anteriores direccion.nIdePersona
            var ListaOld = db.SIPDetDireccion.Where(s => s.nIdeEmpresa == direccion.nIdeEmpresa && s.dFecFinVig == null).ToList();
            ListaOld.ForEach(x => x.dFecFinVig = ayer);
            db.SaveChanges();
            //return listaPersonaById(direccion.nIdePersona);
            db = new BDSIPFEEntities();
            return db.SIPMaeEmpresa.Where(x => x.nIdeEmpresa == direccion.nIdeEmpresa).FirstOrDefault();
        }

        public SIPMaeEmpresa AgregaVinculoEmpresaDAO(int n_IdeVinculo, string n_IdeCategoria, int n_IdeEmpresa, int n_IdeUsuario)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            int categoria = Int32.Parse(n_IdeCategoria);
            int cantVinculo = db.SIPDetVinculoEmpresa.Where(s => s.nIdeTipoVinculo == n_IdeVinculo && s.nIdeEmpresa == n_IdeEmpresa && s.nIdeCategoria == categoria && (s.dFecFinVig == null ? DateTime.Today : s.dFecFinVig) >= DateTime.Today && s.dFecIniVig <= DateTime.Today).Count();
            if (cantVinculo <=0)
            {
                SIPDetVinculoEmpresa item = new SIPDetVinculoEmpresa();
                item.nIdeEmpresa = n_IdeEmpresa;
                item.nIdeTipoVinculo = n_IdeVinculo;
                if (!string.IsNullOrEmpty(n_IdeCategoria)) item.nIdeCategoria = categoria;
                item.nIdeEmpresa = n_IdeEmpresa;
                item.nIdeUsuReg = n_IdeUsuario;
                item.dtFecReg = DateTime.Now;
                item.dFecIniVig = hoy;
                db.SIPDetVinculoEmpresa.Add(item);
                db.SaveChanges();
            }            
            db = new BDSIPFEEntities();
            return db.SIPMaeEmpresa.Where(x => x.nIdeEmpresa == n_IdeEmpresa).FirstOrDefault();
        }
        
        public int CheckVinculoEmpresaDAO(int n_IdeVinculo, int n_IdeEmpresa)
        {
            int rpta = db.SIPDetVinculoEmpresa.Where(s => s.nIdeEmpresa == n_IdeEmpresa && s.nIdeTipoVinculo == n_IdeVinculo && (s.dFecFinVig == null ? DateTime.Today : s.dFecFinVig) >= DateTime.Today && s.dFecIniVig <= DateTime.Today).Count();

            //var rpta = db.SIPDetVinculoEmpresa.Where(s => s.nIdeEmpresa == n_IdeEmpresa && s.nIdeVinculoEmpresa == n_IdeVinculo  && s.dFecFinVig.GetValueOrDefault().Date >= DateTime.Now.Date).ToList();
            //i.MyDateColumn.GetValueOrDefault().Date
           // return 0;
            return rpta > 0 ? 1 : 0;
        }

        public SIPMaeEmpresa RegistrarContactoEmpresaDAO(int n_IdePersona, int n_IdeCargo, string n_IdeTipoContacto, int n_IdeEmpresa, int n_IdeUsuario)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            int cantContacto = db.SIPDetContacto.Where(s => s.nIdePersona == n_IdePersona && s.nIdeEmpresa == n_IdeEmpresa && s.nIdeCargo == n_IdeCargo && (s.dFinVig == null ? DateTime.Today : s.dFinVig) >= DateTime.Today && s.dIniVig <= DateTime.Today).Count();
            
            if (cantContacto <= 0)
            {
                SIPDetContacto item = new SIPDetContacto();
                item.nIdeCargo      = n_IdeCargo;
                item.nIdeEmpresa    = n_IdeEmpresa;
                item.nIdePersona    = n_IdePersona;
                if (!string.IsNullOrEmpty(n_IdeTipoContacto)) item.nIdeTipoConta = Int32.Parse(n_IdeTipoContacto);
                item.nIdeUsuReg     = n_IdeUsuario;
                item.dtFecReg       = DateTime.Now;
                item.dIniVig        = hoy;
                db.SIPDetContacto.Add(item);
                db.SaveChanges();
            }
            db = new BDSIPFEEntities();
            return db.SIPMaeEmpresa.Where(x => x.nIdeEmpresa == n_IdeEmpresa).FirstOrDefault();
        }

        public string[] RegistraDatosEmpresaInpDAO(SIPMaeEmpresa sipMaeEmpresa)
        {
            db.SIPMaeEmpresa.Add(sipMaeEmpresa);
            db.SaveChanges();
            return new String[] { sipMaeEmpresa.nIdeEmpresa.ToString() };
        }

        public int CerrarVigenciaItemDAO(int nIdeItem, string tabla, DateTime ayer)
        {
            int rpta = 0;

            if (tabla.Equals("telefono"))
            {
                SIPDetTelefono t1 = new SIPDetTelefono();
                t1 = db.SIPDetTelefono.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("correo"))
            {
                SIPDetCorreo t1 = new SIPDetCorreo();
                t1 = db.SIPDetCorreo.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("centroestudio"))
            {
                SIPDetCentroEstudio t1 = new SIPDetCentroEstudio();
                t1 = db.SIPDetCentroEstudio.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("idioma"))
            {
                SIPDetIdioma t1 = new SIPDetIdioma();
                t1 = db.SIPDetIdioma.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("otroestudio"))
            {
                SIPDetOtroEstudio t1 = new SIPDetOtroEstudio();
                t1 = db.SIPDetOtroEstudio.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("reconocimiento"))
            {
                SIPDetReconocimiento t1 = new SIPDetReconocimiento();
                t1 = db.SIPDetReconocimiento.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("trabajosocial"))
            {
                SIPDetTrabajoSocial t1 = new SIPDetTrabajoSocial();
                t1 = db.SIPDetTrabajoSocial.Find(nIdeItem);
                t1.dfecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dfecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("socioecono"))
            {
                SIPDetSocioEcono t1 = new SIPDetSocioEcono();
                t1 = db.SIPDetSocioEcono.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("refefamiliar"))
            {
                SIPDetVinculoFamilia t1 = new SIPDetVinculoFamilia();
                t1 = db.SIPDetVinculoFamilia.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("laboral"))
            {
                SIPDetLaboral t1 = new SIPDetLaboral();
                t1 = db.SIPDetLaboral.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("otrosingresos"))
            {
                SIPDetOtroIngreso t1 = new SIPDetOtroIngreso();
                t1 = db.SIPDetOtroIngreso.Find(nIdeItem);
                t1.dtFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dtFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("beneficio"))
            {
                SIPDetBeneficio t1 = new SIPDetBeneficio();
                t1 = db.SIPDetBeneficio.Find(nIdeItem);
                t1.dfecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dfecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("contacto"))
            {
                SIPDetContacto t1 = new SIPDetContacto();
                t1 = db.SIPDetContacto.Find(nIdeItem);
                t1.dFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("vinculo"))
            {
                SIPDetVinculoEmpresa t1 = new SIPDetVinculoEmpresa();
                t1 = db.SIPDetVinculoEmpresa.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("patrimonio"))
            {
                SIPDetPatrimonio t1 = new SIPDetPatrimonio();
                t1 = db.SIPDetPatrimonio.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("direccion"))
            {
                SIPDetDireccion t1 = new SIPDetDireccion();
                t1 = db.SIPDetDireccion.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }
            else if (tabla.Equals("adjuntopersona"))
            {
                SIPDetArchivoPersona t1 = new SIPDetArchivoPersona();
                t1 = db.SIPDetArchivoPersona.Find(nIdeItem);
                t1.dFecFinVig = ayer;
                db.Entry(t1).State = EntityState.Modified;
                db.SaveChanges();
                return (t1.dFecFinVig != null) ? rpta = 1 : rpta = 0;
            }

            // 
            return rpta;
        }


        public int cerrarVigenciaEnGrupoDAO_old(int nIdeGrupo, DateTime hoy)
        {
            SIPDetCompGrupo sipDetCompGrupo = new SIPDetCompGrupo();
            sipDetCompGrupo = db.SIPDetCompGrupo.Find(nIdeGrupo);
            sipDetCompGrupo.dFecFinVig = hoy;
            db.Entry(sipDetCompGrupo).State = EntityState.Modified;
            db.SaveChanges();
            return (sipDetCompGrupo.dFecFinVig != null) ? 1 : 0;
        }

        public List<SIPMaeSolicitud> listaAccionesEmpresaDAO(int nIdeEmpresa, int nIdeDep)
        {
            return db.SIPMaeSolicitud.Where(s => s.nIdeEmpresa == nIdeEmpresa && s.nIdeClaseSolicitud == Constante.CLASE_TRAMITE.NUMERO_ACCION && s.nIdeDepSolicitud == nIdeDep).ToList();
        }
    }
}
